package cn.good.yan.service.t11;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 11.AQS
 * ReadWriteLock 读写锁  - 锁降级
 * 锁降级：遵循获取写锁→再获取读锁→再释放写锁的次序，写锁能够降级成为读锁。
 * 如果一个线程占有了写锁，在不释放写锁的情况下，它还能占有读锁，即写锁降级为读锁。
 * 读没有完成时候写锁无法获得锁，必须要等着读锁读完后才有机会写
 *
 * @author shengren.yan
 * @create 2024-04-10
 */
public class ReadWriteLockDemo2 {
    public static void main(String[] args) {
        // 读写锁
        ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        // 读锁
        ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
        // 写锁
        ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();

        // 正常 A B两个线程
        // A线程
//        readLock.lock();
//        System.out.println("----读取");
//        readLock.unlock();
//
//        // B线程
//        writeLock.lock();
//        System.out.println("----写入");
//        writeLock.unlock();

        // 本例，only one 同一个线程
        readLock.lock();    // 这里有一个读锁，下面有一个写锁（writeLock），读锁没有unlock，就不会执行写锁（writeLock）
        System.out.println("----读取");
        readLock.unlock();

        writeLock.lock();
        System.out.println("----写入");

        /**
         * biz
         *  .....
         */
        writeLock.unlock();
    }

}
